//  * @param {number[]} nums
//  * @return {number[][]}
//  */
// 标签：数组遍历
// 首先对数组进行排序，排序后固定一个数 nums[i]nums[i]，再使用左右指针指向 nums[i]nums[i]后面的两端，数字分别为 nums[L]nums[L] 和 nums[R]nums[R]，计算三个数的和 sumsum 判断是否满足为 00，满足则添加进结果集
// 如果 nums[i]nums[i]大于 00，则三数之和必然无法等于 00，结束循环
// 如果 nums[i]nums[i] == nums[i-1]nums[i−1]，则说明该数字重复，会导致结果重复，所以应该跳过
// 当 sumsum == 00 时，nums[L]nums[L] == nums[L+1]nums[L+1] 则会导致结果重复，应该跳过，L++L++
// 当 sumsum == 00 时，nums[R]nums[R] == nums[R-1]nums[R−1] 则会导致结果重复，应该跳过，R--R−−
// 时间复杂度：O(n^2)O(n 
// 2
//  )，nn 为数组长度


var threeSum = function (nums) {
        // 先进行排序
        nums.sort((a, b) => a - b);
        let res = [];
        for (var i = 0; i < nums.length - 2; i++) {
                if (nums[i] > 0) break;

                if (i > 0 && nums[i - 1] === nums[i]) {
                        continue
                }; //去重
                var right = nums.length - 1;
                var left = i + 1;
                while (left < right) {
                        var sum = nums[i] + nums[left] + nums[right];
                        if (sum === 0) {
                                res.push([nums[i], nums[left], nums[right]])
                                while (left < right && nums[left] == nums[left + 1]) { //再次进行去重，先来判断是不是比后面的小
                                        left++;
                                }
                                while (left < right && nums[right] == nums[right - 1]) { //再次进行去重，先来判断是不是比后面的小
                                        right--;
                                }
                                left++;
                                right--;
                        }
                        if (sum > 0) {
                                right--;
                        }
                        if (sum < 0) {
                                left++;
                        }
                }
        }
        return res
};
// console.log(threeSum([-4, -3, -1, 0, 1, 2, 4]));
var c = threeSum(
        [-1, 0, 1, 2, -1, -4])
console.log(c);